import tkinter as tk
# 图像处理库
from PIL import Image, ImageTk
# HTML库 pip install tkhtmlview
from tkhtmlview import HTMLLabel


# 感受器初始化
def start():
    # 视觉感受器分布在一个二维平面上，所以是一个二维数组。这里采用的最大细胞数是10*10，中间是视锥细胞为6*6，其余为视杆细胞
    eye = []
    # 视觉范围
    size = 10
    # 视锥细胞范围
    color = 6
    # 视杆细胞范围
    light = (size - color) / 2
    for i in range(size):
        eye.append([])
        for j in range(size):
            if i >= light and i < size - light and j >= light and j < size - light:
                # RGB  红、绿、蓝视觉细胞的分布
                eye[i].append('1')
            else:
                eye[i].append('0')
    return eye

def update_label(html_label, new_html):
    # 将新的 HTML 内容设置给 HTMLLabel 的 html 属性
    html_label.html = new_html

def show_img(event):
    # 填充字符
    code = "▄"
    global eye
    # 返回视觉焦点的坐标
    x, y = event.x, event.y
    # 行数
    rows = len(eye)
    # 高度中心点
    row_y = rows // 2
    # 注意位置
    table = '<table>'
    # 逐行
    for i in range(rows):
        table += '<tr>'
        cols = len(eye[i])
        # 列中心点
        col_x = cols // 2
        # 逐列
        for j in range(cols):
            # X轴对应点
            sx = j + x - col_x
            # Y轴对应点
            sy =  i + y - row_y
            # 指定区域内
            html = ''
            if sx >= 0 and sx < 600 and sy >=0 and sy<= 450:
                # 返回图片指定坐标的RGB颜色值
                data = img.getpixel((sx, sy))
                R, G, B = data[:3]
                if eye[i][j] == '1':
                    # RGB(视锥细胞)区域
                    html = '<td style="color:'+ RGB(R,G,B) +';padding: 5px;">'+ code +'</td>'
                else:
                    # 灰度(视杆细胞)区域
                    gray = (R+G+B)//3
                    html = '<td style="color:'+ GRAY(gray) +';padding: 5px;">'+ code +'</td>'
            else:
                # 图片存在
                html = f'<td style="color:#000;padding: 5px;">'+ code +'</td>'
            table += html
        table += '</tr>'
    table += '</table>'
    print(table)
    # 更新HTML表格
    html_label.set_html(table)

# 转十六进制RGB颜色
def RGB(r,g,b):
    return f"#{r:02x}{g:02x}{b:02x}"


# 转十六进制RGB灰度色
def GRAY(rgb):
    return f"#{rgb:02x}{rgb:02x}{rgb:02x}"


# 单个视杆细胞工作过程


# 主窗口
root = tk.Tk()
root.title("模拟视觉感受器")
# 窗口尺寸
root.geometry("600x1200")
# 图像尺寸
canvas = tk.Canvas(root, width=600, height=450)
canvas.pack()
canvas.bind("<Button-1>", show_img)
# 填充图像，注意图片文件的路径
img = Image.open("2/4/forest.jpg")
img_tk = ImageTk.PhotoImage(img)
canvas.create_image(0, 0, anchor=tk.NW, image=img_tk)
# 输出区域
table_html = ""
html_label = HTMLLabel(root, html=table_html)

html_label.pack(fill="both", expand=True)

# 初始化视觉范围
eye = start()

root.mainloop()